package br.com.guardaroupavirtual.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.guardaroupavirtual.facade.Facade;
import br.com.guardaroupavirtual.helper.Diretorios;
import br.com.guardaroupavirtual.helper.HibernateHelper;
import br.com.guardaroupavirtual.model.Categoria;
import br.com.guardaroupavirtual.model.Loja;
import br.com.guardaroupavirtual.model.Usuario;

@WebServlet(value="/CategoriaController", name="CategoriaController")
public class CategoriaController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	private Facade fachada;

	private HttpServletRequest request;
	private HttpServletResponse response;
	
	private Session session;
	private Transaction transaction;
	
	private String cmd;	

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.request = request;
		this.response = response;
		
		if(request.getSession().getAttribute("usuario") == null){
			request.getRequestDispatcher(String.format(Diretorios.Usuario, "login.jsp")).forward(request, response);
		}
		
		cmd = request.getParameter("cmd");
		
		//Verifica se foi passado uma ação para variavel cmd
		if(cmd == null || cmd.isEmpty()){
			request.setAttribute("categorias", this.getCategorias());
			request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);
		}else{
			if (cmd.equalsIgnoreCase("cadastrar")) {
				request.setAttribute("lojas", this.getLojas());
				request.getRequestDispatcher(String.format(Diretorios.Categoria, "cadastra_categoria.jsp")).forward(request, response);
			}
			if (cmd.equalsIgnoreCase("alterar")) {
				session = HibernateHelper.getSessionFactory().openSession();
				Categoria categoria = fachada.getCategoria(session, Integer.parseInt(request.getParameter("id")));
				Usuario usuarioSessao = (Usuario) request.getSession().getAttribute("usuario");
				if(categoria.getUsuario().getId() != usuarioSessao.getId()){
					request.setAttribute("categorias", this.getCategorias());
					request.setAttribute("mensagem", "Categoria não encontrada!");
					request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);
				}				
				request.setAttribute("categoria", categoria);
				request.setAttribute("lojas", this.getLojas());
				request.getRequestDispatcher(String.format(Diretorios.Categoria, "altera_categoria.jsp")).forward(request, response);				
			}
			if (cmd.equalsIgnoreCase("deletar")) {
				this.deletar();
			}
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.request = request;
		this.response = response;
		
		cmd = request.getParameter("cmd");
		if (cmd.equalsIgnoreCase("cadastrar")) {
			this.cadastrar();
		}
		if (cmd.equalsIgnoreCase("alterar")) {
			this.alterar();
		}
	}
	
	private List<Categoria> getCategorias() {
		session = HibernateHelper.getSessionFactory().openSession();
		fachada = Facade.getCurrentInstance();
		return fachada.getCategorias(session);
	}
	
	private void cadastrar() throws ServletException, IOException {
		session = HibernateHelper.getSessionFactory().openSession();
		transaction = session.beginTransaction();
		try {
			Categoria categoria = new Categoria();
			categoria.setNome(request.getParameter("nome"));
			
			fachada = Facade.getCurrentInstance();
			Loja loja = fachada.getLoja(session, Integer.parseInt(request.getParameter("lojaID")));
			Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
			categoria.setUsuario(usuario);
			
			categoria.setLoja(loja);
			fachada.cadastrarCategoria(session, categoria);
			
			transaction.commit();
			request.setAttribute("mensagem", "Registro inserido com sucesso!");
		} catch (Exception e) {
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar inserir o registro!");
			transaction.rollback();
		}
		request.setAttribute("categorias", this.getCategorias());
		request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);
	}
	
	private void alterar() throws ServletException, IOException {
		session = HibernateHelper.getSessionFactory().openSession();
		transaction = session.beginTransaction();
		try {
			fachada = Facade.getCurrentInstance();
			
			Categoria categoria = fachada.getCategoria(session, Integer.parseInt(request.getParameter("id")));
			categoria.setNome(request.getParameter("nome"));
			Loja loja = fachada.getLoja(session, Integer.parseInt(request.getParameter("lojaID")));
			categoria.setLoja(loja);
			fachada.alterarCategoria(session, categoria);;
			
			transaction.commit();
			request.setAttribute("mensagem", "Registro alterado com sucesso!");
		} catch (Exception e) {
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar alterar o registro!");
			transaction.rollback();
		}
		request.setAttribute("categorias", this.getCategorias());
		request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);		
	}
	
	private List<Loja> getLojas(){
		session = HibernateHelper.getSessionFactory().openSession();
		fachada = Facade.getCurrentInstance();
		return fachada.getLojas(session);
	}
	
	private void deletar() throws ServletException, IOException {
		session = HibernateHelper.getSessionFactory().openSession();
		transaction = session.beginTransaction();
		try {
			fachada = Facade.getCurrentInstance();
			Categoria categoria = fachada.getCategoria(session, Integer.parseInt(request.getParameter("id")));
			Usuario usuarioSessao = (Usuario) request.getSession().getAttribute("usuario");
			if(categoria.getUsuario().getId() != usuarioSessao.getId()){
				request.setAttribute("categorias", this.getCategorias());
				request.setAttribute("mensagem", "Categoria não encontrada!");
				request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);
			}			
			fachada.deletarCategoria(session, categoria);
			transaction.commit();
			request.setAttribute("mensagem", "Registro excluido com sucesso!");
		} catch (Exception e) {
			transaction.rollback();
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar excluir o registro!");
		}
		request.setAttribute("categorias", this.getCategorias());
		request.getRequestDispatcher(String.format(Diretorios.Categoria, "lista_categoria.jsp")).forward(request, response);
	}

}
